package Cartas;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Baralho {

	public static final int VAZIO = 0;
	public static final int COMPLETO = 1;
	
	private List<Carta> cartas = new ArrayList<>();
	public List<Carta> getCartas() {
		
		return cartas;
	}
	
	public Baralho(int tipo) {
		
		if (tipo == COMPLETO) {
			this.cartas = criarCartas();
			this.embaralhar();
		}
	}
	
	private List<Carta> criarCartas() {
		
		List<Carta> cartasNovas = new ArrayList<>();
		
		for (int i = 0; i < 4; i++){
			//criando 4 cartas coringa
			Coringa c = new Coringa();
			cartasNovas.add(c);
			
			//criando 4 cartas coringa +4
			ComprarQuatro cq = new ComprarQuatro();
			cartasNovas.add(cq);
		}
		
		
		for (Cor c:Cor.values()){
			//criando 2 cartas Pular para cada cor
			cartasNovas.add(new Pular(c));
			cartasNovas.add(new Pular(c));
			
			//criando 2 cartas Pular para cada cor
			cartasNovas.add(new ComprarDuas(c));
			cartasNovas.add(new ComprarDuas(c));
			
			//criando 2 cartas Inverter para cada cor
			cartasNovas.add(new Inverter(c));
			cartasNovas.add(new Inverter(c));
			
			//criando 1 carta num�rica nas 4 cores
			cartasNovas.add(new CartaNumerica(c, 0));
			
			//criando cartas num�ricas de 1 a 9
			for (int i = 1; i < 10; i++){
				//criando 2 cartas num�ricas de mesmo n�mero nas quatro cores
				cartasNovas.add(new CartaNumerica(c,i));
				cartasNovas.add(new CartaNumerica(c,i));
			}
		}
		
		return cartasNovas;
	}
	
	public void embaralhar() {
		//embaralhando as cartas
		Collections.shuffle(this.cartas);
	}
	
	public void adicionaCarta(Carta carta) {
		
		cartas.add(carta);
	}
	
	public void adicionaCartas(List<Carta> cartas) {
		cartas.addAll(cartas);
	}
	
	public void adicionaCartas(Baralho baralho) {
		cartas.addAll(baralho.cartas);
	}
	
	public Carta retirarCarta() {
		try {
			return cartas.remove(0);	
		} catch (Exception e) {
			// TODO: handle exception
		}
		return null;
		
	}
	
	public void retirarCarta(Carta carta) {
		cartas.remove(carta);
	}
	
	public boolean possui(Carta carta) {
		return cartas.contains(carta);
	}

	public boolean estaVazio() {
		return cartas.isEmpty();
	}
	
	public int quantidadeCartas() {
		return cartas.size();
	}

}
